home *** CD-ROM | disk | FTP | other *** search
-
- /* --- C ---
- ************************************************************************
- *
- * Filename : sec.c
- * Description : Security routines - Confidentiality and Integrity
- * coding and decoding
- * Part of : SECMPEG
- *
- * Version : 1.0
- * Language : C
- * For machine : SunOS 4.1.x, INTERACTIVE Unix 2.2.1, Linux, MS-DOS
- * Compile as : see Makefile
- *
- * Authors : Juergen Meyer, Frank Gadegast
- * Contact : jm@cs.tu-berlin.de, phade@cs.tu-berlin.de
- *
- ************************************************************************
- */
-
- #include <stdio.h>
- #include "defs.h"
- #include "marker.h"
-
- /* ------ PUBLIC ------ */
-
- int WriteSecureMpegHeader();
- int WriteSecureMpegInfo();
- int ReadSecureMpegHeader();
- int ReadSecureMpegInfo();
- unsigned long GetPictureHeader(int);
- int EncryptFrame(int,unsigned long);
- int DecryptFrame(int,unsigned long);
- int SetTableEntries(int,unsigned long);
-
- /* ------ PRIVAT ------ */
-
- /* ------ IMPORT ------ */
-
- extern int Encrypt(char *,unsigned long); /* des.c */
- extern int Decrypt(char *,unsigned long);
-
- extern int GetByte(); /* stream.c */
- extern int _GetnBit(int);
- extern void readalign();
- extern BYTE *frame_buffer;
- extern int input;
- extern int output;
- extern long total_bytes_read;
- extern int end_of_file;
-
- extern int c_level; /* main.c */
- extern int i_level;
- extern int c_table_entries;
- extern SECUREHEADER sec_header;
- extern SECUREINFO sec_info;
- extern SECURETABLE c_table[];
- extern INTEGRTABLE i_table[];
- extern int WRITE;
-
- extern int HorizontalSize;
- extern int VerticalSize;
-
-
- int WriteSecureMpegHeader()
- {
- strncpy (sec_header.Info,HEADER_INFO, 8);
- strncpy (sec_header.Id ,HEADER_ID, 8);
- if (c_level > -1)
- Encrypt ((char *)&sec_header+8, sizeof (SECUREHEADER)-8);
- if (WRITE)
- return (write (output, (void *)&sec_header, sizeof(SECUREHEADER)));
- else return (TRUE);
- }
-
- int WriteSecureMpegInfo()
- {
- unsigned table_size;
- short c_size;
-
- c_size = sec_info.ConfidentialityDataSize;
-
- if (c_level > -1)
- Encrypt((char *)&sec_info,(unsigned long)sizeof(SECUREINFO));
- if (WRITE)
- write(output,(void *)&sec_info,sizeof(SECUREINFO));
- if (i_level > -1)
- {
- table_size = sizeof (INTEGRTABLE);
- table_size += (DESBLOCK - (table_size % 8));
- /*
- if (c_level > -1) Encrypt((char *)&i_table, table_size);
- */
- if (WRITE)
- write (output, (void *)&i_table, table_size);
- }
- if(c_size > 0)
- {
- table_size = sizeof(SECURETABLE) * c_size;
- table_size += (DESBLOCK - (table_size % 8));
- Encrypt((char *)&c_table, (unsigned long)table_size);
- if (WRITE)
- write(output,(void *)&c_table,table_size);
- }
- return(TRUE);
- }
-
- int ReadSecureMpegHeader()
- {
- if (read (input, (void *)&sec_header, sizeof(SECUREHEADER)) !=
- sizeof (SECUREHEADER)) return(ERROR_READ);
- if (strncmp (sec_header.Info,HEADER_INFO,8)) return (ERROR_NO_SECMPEG);
- if (strncmp (sec_header.Id, HEADER_ID, 8))
- {
- Decrypt ((char *)&sec_header+8, sizeof (SECUREHEADER)-8);
- if (strncmp (sec_header.Id, HEADER_ID, 8)) return (ERROR_NOT_FGJM);
- }
- i_level = (int) sec_header.IntegrityInfo;
- c_level = (int) sec_header.ConfidentialityInfo;
- return(TRUE);
- }
-
- int ReadSecureMpegInfo()
- {
- unsigned table_size;
-
- if (read (input, (void *)&sec_info, sizeof(SECUREINFO)) !=
- sizeof (SECUREINFO)) return (ERROR_READ);
- if (c_level > -1)
- Decrypt ((char *)&sec_info, (unsigned long)sizeof(SECUREINFO));
- if (!sec_info.NextHeader) end_of_file = TRUE;
- if (i_level > -1)
- {
- table_size = sizeof(INTEGRTABLE);
- table_size += (DESBLOCK - (table_size % 8));
- if(read(input,(void *)&i_table,table_size) != table_size)
- return(ERROR_READ);
- /*
- if (c_level > -1) Decrypt ((char *)&i_table, table_size);
- */
- }
- if (sec_info.ConfidentialityDataSize > 0)
- {
- table_size = sizeof (SECURETABLE) * sec_info.ConfidentialityDataSize;
- table_size += (DESBLOCK - (table_size % 8));
- if (read (input,(void *) &c_table,table_size) != table_size)
- return (ERROR_READ);
- Decrypt ((char *)&c_table, (unsigned long)table_size);
- }
- return(TRUE);
- }
-
- unsigned long GetPictureHeader(int fill_table)
- {
-
- int index = 2;
- int mbsc[3];
- int trailor_val;
- int sliceheader = 0;
- unsigned long start;
- unsigned short len;
-
- #ifdef DEBUG
- fprintf(stderr,"%s \n","GetHeader");
- #endif
-
- c_table_entries = 0;
- readalign();
- start = total_bytes_read;
- mbsc[0] = GetByte();
- mbsc[1] = GetByte();
- do
- {
- mbsc[index++] = GetByte();
- if((mbsc[0] + mbsc[1] + mbsc[2]) == 1)
- {
- trailor_val = GetByte();
- #ifdef TEST_DEBUG
- fprintf(stderr,
- " found header at : %lu headertype %d \t",
- total_bytes_read,trailor_val);
- #endif
-
- switch(trailor_val)
- {
- case PSC : return(total_bytes_read - start);
-
- case VSEC : end_of_file = TRUE;
- return(total_bytes_read - start);
-
- case VSSC : HorizontalSize = _GetnBit(12); /* eigendlich VS Header */
- VerticalSize = _GetnBit(12); /* mehr Information wird */
- readalign(); /* aber nicht ben÷tigt */
-
- break;
- case UDSC :
- case EXSC :
-
- case GOPSC: if(fill_table)
- c_table[c_table_entries++].Offset = (unsigned short)(total_bytes_read - start);
- break;
-
- default : if(fill_table)
- c_table[c_table_entries++].Offset = (unsigned short)(total_bytes_read - start);
- break;
- }
-
- mbsc[0] = mbsc[1] = mbsc[2] = 0xff;
-
- }
- index = index % 3;
-
- }
- while(!end_of_file);
- #ifdef DEBUG
- fprintf(stderr,"%s \n","no more Header found (End of File)");
- #endif
- return(0L);
- }
-
-
- int EncryptFrame(int table_size,unsigned long frame_len)
- {
- int i;
-
- if(table_size)
- for(i = 0 ; i < table_size; i++)
- Encrypt((char *)frame_buffer+c_table[i].Offset,c_table[i].Len);
- else
- Encrypt((char *)frame_buffer,frame_len);
- return(TRUE);
- }
-
-
- int DecryptFrame(int table_size, unsigned long frame_len)
- {
- int i;
-
- if(table_size)
- for(i = 0 ; i < table_size; i++)
- Decrypt((char *)frame_buffer+c_table[i].Offset,c_table[i].Len);
- else
- Decrypt((char *)frame_buffer,frame_len);
- return(TRUE);
- }
-
-
- int SetTableEntries(int nbytes,unsigned long frame_len)
- {
- int index = 0;
- int i;
- unsigned short len;
-
- c_table[0].Offset = 0;
- c_table[0].Len = (unsigned short)nbytes;
- c_table[1].Len = 0;
- for(i = 1;i < c_table_entries; i++)
- {
- c_table[i].Offset -= 4;
- if(c_table[i].Offset > (c_table[index].Len + c_table[index].Offset))
- {
- index++;
- c_table[index].Offset = c_table[i].Offset ;
- c_table[index].Len = (unsigned short)nbytes;
- }
- else
- c_table[index].Len += (unsigned short)nbytes;
-
- }
-
- if((c_table[index].Offset + c_table[index].Len) > (unsigned short)frame_len)
- {
- /* last header is not a SliceHeader */
-
- len = (unsigned short)frame_len - c_table[index].Offset;
- len += 7;
- len >>= 3;
- len <<= 3;
- if((c_table[index-1].Offset + c_table[index-1].Len + len) > (unsigned short)frame_len)
- {
- index--;
- c_table[index].Len += len;
- }
- else
- c_table[index].Len = len;
- c_table[index].Offset = (unsigned short)frame_len - c_table[index].Len;
-
- }
-
- index++;
-
- return(index);
- }
-
- int CryptStream (code)
- int code;
- {
- long len;
-
- do
- {
- len = read (input, (void *)frame_buffer, (unsigned)FRAME_BUFFERSIZE);
- if (len > -1)
- {
- if (code == M_CENCRYPT) Encrypt ((char *)frame_buffer, len);
- else Decrypt ((char *)frame_buffer, len);
- write (output, (void *)frame_buffer, (unsigned)len);
- }
- } while (len == FRAME_BUFFERSIZE);
- if (len < 0) return (ERROR_READ);
- else return (ERROR_NONE);
- }
-
- long mvalue = 0;
-
- int CrcStream ()
- {
- long len;
-
- do
- {
- len = read (input, (void *)frame_buffer, (unsigned)FRAME_BUFFERSIZE);
- if (len > -1) mvalue += crc32buf ((char *)frame_buffer, len);
- } while (len == FRAME_BUFFERSIZE);
- if (len < 0) return (ERROR_READ);
- else return (ERROR_NONE);
- }
-
-